package com.hmall.gateway.filter;

import com.hmall.common.dto.User;

import com.hmall.common.web.UserClient;
import com.hmall.context.BaseContext;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.List;

/**
 * @Auth：Yang Zhen
 * @Desc：网关 Gateway 过滤器，为每一条经过网关的请求添加请求头
 * @Date：2023/4/20 19:53
 */
@Order(Integer.MIN_VALUE)
@Component
@Slf4j
public class authorizationFilter implements GlobalFilter {

    @Autowired
    UserClient openFeignService;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取到请求里面的参数
        MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
        // 获取到请求里面的 username 参数
        List<String> strings = queryParams.get("username");
        // 如果 strings 为 null，证明用户不是通过前端正常登陆的，和前端约定好的每条请求都要携带 username，后期可以换成 token
        // 现在前端没办法修改 只能暂时以 username 为用户的唯一标识
        // if (strings == null || strings.size() == 0) {
        //     // 如果strings为null，或者strings的集合长度为0 返回 412 证明所需要的条件不够 非法登录
        //     exchange.getResponse().setStatusCode(HttpStatus.PRECONDITION_FAILED);
        //     log.error("用户非法登录！！！");
        //     return exchange.getResponse().setComplete();
        // }
        // 调用 feign 请求 userService 获取请求的用户 ID
        User users = openFeignService.seleceByUsername("zhangsan");
        // User users = openFeignService.seleceByUsername(strings.get(0));
        // 如果 users 为空证明数据库里面没有 此 username 的用户信息
        if (users == null) {
            // 返回 401 Unauthorized. 状态码 （证明用户权限不够）
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            log.error("用户不存在！！！");
            return exchange.getResponse().setComplete();
        }
        // 如果上面的校验都通过了，证明 用户存在
        // 调用 BaseContext.setCurrentId() 方法 存入到线程里面当前请求的用户 ID
        BaseContext.setCurrentId(users.getId());
        log.info("BaseContext：" + String.valueOf(BaseContext.getCurrentId()));
        log.info("查询到的用户名{ " + users.getUsername() + " }, ID为：" + users.getId());
        // 1、获取请求
        ServerHttpRequest request = exchange.getRequest();
        // 2、添加 authorization 参数
        request = request.mutate().header("authorization", String.valueOf(users.getId())).build();
        // 3、放行
        return chain.filter(exchange.mutate().request(request).build());
    }

}
